查看原文
其他

Seaborn官方教程中文教程(一)

大邓 大邓和他的Python 2019-04-26

seaborn官方文档翻译

统计分析是理解数据集中各个变量彼此关系的重要过程,通过统计分析,我们就可以洞见数据中隐藏的趋势和规律,更好的揭示数据之间的关系。

在本教程中我们主要讨论三种seaborn函数

  • relplot(kind)  画图函数kind参数可以为"scatter"或者"line"

  • scatterplot()  散点图函数

  • lineplot()   折线图函数

不论数据结构多么复杂,seaborn的这些函数可以很简明的将数据展示出来。比如在二维空间中,seaborn可以在图中通过色调(hue)、尺寸(size)、风格(style)等方式来展示三维数据结构。具体怎么使用请看继续往下学习

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns

#让jupyter notebook的Cell可以将多个变量显示出来。
from IPython.core.interactiveshell import InteractiveShell
InteractiveShell.ast_node_interactivity = 'all'

sns.set(style="darkgrid")

使用散点图展现相关变量 

散点图是统计可视化方法中的中流砥柱。可以使用relplot(kind='scatter')或者scatter()作图

tips = pd.read_csv('tips.csv')
#tips数据集中包含total_bill、tip、sex、smoker、day、time、size这些字段
tips.head()
sns.relplot(x="total_bill"
            y="tip"
            data=tips)
#sns.scatterplot(x="total_bill", y="tip", data=tips) #效果等同于relplot函数


style样式

当有第三个变量参与绘图,在seaborn中可以使用style(类别样式参数),因为类别本身也是带有信息的。

sns.relplot(x="total_bill"
            y="tip"
            style="smoker"
            data=tips)

hue色标

但是上图看着smoker类目,No和yes很难在图中区分。如果能有色调的区别,更容易肉眼区分开来。这里使用色调参数 hue

sns.relplot(x="total_bill"
            y="tip"
            hue="smoker"
            style="smoker"
            data=tips)

当然我们也可以在图中对四种变量进行统计性分析。四个变量分别是total_bill、tip、smoker、time

sns.relplot(x="total_bill"
            y="tip"
            hue="smoker"
            style="time"
            data=tips)

palette调色板

在两个例子中,我们可以自定义调色板(color palette),这样做有很多options。在这里,我们使用字字符串接口自定义 顺序调色板

sns.relplot(x="total_bill"
            y="tip"
            hue="size"
            #ch变化范围(2.5,-0.2),从浅色(大于0)到深色(小于0)
            #色调的明暗程度dark取值范围(0,1),dark值越大散点的颜色越浅
            palette="ch:2.5,-0.2,dark=0.1"
            data=tips)

size尺寸

对于三个变量的可视化,其实还可以使用尺寸size参数来可视化。

sns.relplot(x='total_bill'
            y='tip'
            size='size'
            data=tips)

size还可以设置范围

sns.relplot(x='total_bill',  
            y='tip'
            size='size'
            sizes=(15200),
            data=tips)

散点图使用很方便,但这并不是万能通用的可视化方法。例如,我们想探索某些数据集中的某个变量随着时间的变化趋势,或者该变量是连续型变量,此时使用lineplot()更好。或者relplot(kind='line')

我们伪造一份随着时间变化的数据

data = dict(time=np.arange(500),
            value=np.random.randn(500).cumsum())

df = pd.DataFrame(data)

g = sns.relplot(x="time",
                y="value",
                kind="line",
                data=df)

g.fig.autofmt_xdate()

sort参数

因为lineplot()假定我们绘制的图因变量是y,自变量是x。绘图前默认从x轴方向对数据进行排序。但是,这种情况是可以被禁用的:

df = pd.DataFrame(np.random.randn(5002).cumsum(axis=0), 
                  columns=["x""y"])

sns.relplot(x="x"
            y="y"
            sort=True
            kind="line"
            data=df)

sns.relplot(x="x"
            y="y"
            sort=False
            kind="line"
            data=df)

03-聚合并表示不确定性

更复杂的数据集将对x变量的相同值有多个观测值。seaborn中默认通过绘制x的平均值和x的95%置信区间来聚合每个x的多个测量值:

fmri = pd.read_csv('fmri.csv')
fmri.head()

sns.relplot(x='timepoint'
            y='signal',
            kind='line',
            data=fmri)

置信区间ci

使用bootstrapping来计算置信区间(confidence intervals),这对于较大的数据集来说会是时间密集型的。因此我们可以对该方法采用禁用。参数ci=None表示禁用

sns.relplot(x='timepoint'
            y='signal',
            kind='line',
            ci=None,
            data=fmri)

另一个好的选择,特别是对于更大的数据,是通过绘制标准偏差sd而不是置信区间来表示每个时间点的分布范围。ci参数设置为'sd'

sns.relplot(x='timepoint'
            y='signal',
            kind='line',
            ci='sd',
            data=fmri)

estimator

要完全剔除聚合效应,请将estimator参数设置为None。当数据在每个点上有多个观察值时,这可能会产生奇怪的效果。

sns.relplot(x='timepoint'
            y='signal',
            kind='line',
            estimator=None,
            data=fmri)


使用语义映射绘制数据子集

Plotting subsets of data with semantic mappings

lineplot()拥有与relplot()、scatterplot()类似的灵活性:同样可以借助色调hue、尺寸size和样式style将三种变量展示在二维图表中。因此我们不用停下来思考如何使用matplotlib对点线具体的参数进行设置。

使用lineplot()也会诊断数据如何借助语义进行聚合。例如在制图时,加入色调hue会将图表分为两条曲线以及错误带(error band),每种颜色对应的指示出数据的子集:

色调hue

下面我们看看hue具体例子

fmri = pd.read_csv('fmri.csv')
fmri.sample(5)

sns.relplot(x='timepoint',
            y = 'signal',
            hue='event',
            kind='line',
            data=fmri)

样式style

改变制图中的样式

sns.relplot(x='timepoint',
            y = 'signal',
            hue='event',
            style='event',
            kind='line',
            data=fmri)

注意上面代码中hue和style参数都是一个变量,所以绘制的图与之前生成的图变动不大。只是cue类曲线从实线变成虚线。

现在hue和style参数不同后,我们在运行试试

sns.relplot(x='timepoint',
            y = 'signal',
            hue='region',
            style='event',
            kind='line',
            data=fmri)

与散点图一样,要谨慎使用多个语义制作线图。 虽然这样操作有时候提供了信息,但图表更难解读。 但即使您只检查一个附加变量的变化,更改线条的颜色和样式也很有用。 当打印成黑白或有色盲的人观看时,这可以使情节更容易理解:

sns.relplot(x='timepoint',
            y = 'signal',
            hue='event',
            style='event',
            kind='line',
            data=fmri)

units

当您使用重复测量数据(即,您有多次采样的单位)时,您还可以单独绘制每个采样单位,而无需通过语义区分它们。这可以避免使图例混乱:

sns.relplot(x="timepoint"
            y="signal"
            hue="region",
            units="subject"
            estimator=None,
            kind="line"
            data=fmri.query("event == 'stim'"))

lineplot()中默认的色彩映射和图例处理还取决于色调hue分类型数据还是数字型数据

dots = pd.read_csv('dots.csv').query("align == 'dots'")
dots.head()

sns.relplot(x="time"
            y="firing_rate",
            hue="coherence"
            style="choice",
            kind="line"
            data=dots)

调色板palette

可能会发生这样的情况:即使色调变量palette是数字,它也很难用线性色标表示。 这就是这种情况,其中色调变量hue以对数方式缩放。 您可以通过传递列表或字典为每一行提供特定的颜色值:

#n_colors值与coherence种类数相等
palette = sns.cubehelix_palette(light=.8, n_colors=6

sns.relplot(x="time"
            y="firing_rate",
            hue="coherence"
            style="choice",
            palette=palette,
            kind="line", data=dots);

hue_norm

或者您可以更改色彩映射的规范化方式

from matplotlib.colors import LogNorm

sns.relplot(x="time"
            y="firing_rate",
            hue="coherence"
            hue_norm=LogNorm(),
            style="choice",
            kind="line"
            data=dots);

size

改变线条的粗细

sns.relplot(x='time',
            y='firing_rate',
            size='coherence',
            style='choice',
            kind='line',
            data=dots)

绘制date数据

df = pd.DataFrame(dict(time=pd.date_range("2017-1-1", periods=500),
                       value=np.random.randn(500).cumsum()))
df.head()

g = sns.relplot(x="time", y="value", kind="line", data=df)
g.fig.autofmt_xdate()


多图展现更多信息

当你想要理解两个变量之间的关系如何依赖于多个其他变量时呢?

最好的方法可能是制作一个以上的图。 因为relplot()基于FacetGrid,所以这很容易做到。 要显示新增变量的影响,而不是将其分配给绘图中的一个语义角色,请使用它来“构思”(facet)可视化。 这意味着您可以创建多个轴并在每个轴上绘制数据的子集:

tips = pd.read_csv('tips.csv')

sns.relplot(x="total_bill"
            y="tip"
            hue="smoker",
            col="time",  #time有几种值,就有几列图
            data=tips);

sns.relplot(x="timepoint"
            y="signal"
            hue="subject",
            col="region",  #region有几种值,就有几列图
            row="event",  #event有几种值,就有几行图
            height=3,
            kind="line"
            estimator=None
            data=fmri);

sns.relplot(x="timepoint"
            y="signal"
            hue="event"
            style="event",
            col="subject"
            col_wrap=3#显示的图片的行数
            height=3
            aspect=1#长宽比,该值越大图片越方。
            linewidth=2.5,
            kind="line"
            data=fmri.query("region == 'frontal'"));

往期文章

100G Python学习资料(免费下载)

100G 文本分析语料资源(免费下载)     

typing库:让你的代码阅读者再也不用猜猜猜  

数据清洗 常用正则表达式大全

大邓强力推荐-jupyter notebook使用小技巧  

PySimpleGUI: 开发自己第一个软件

深度特征合成:自动生成机器学习中的特征

Python 3.7中dataclass的终极指南(一) 

Python 3.7中dataclass的终极指南(二) 

2017年度15个最好的数据科学领域Python库    

使用Pandas更好的做数据科学

[计算消费者的偏好]推荐系统与协同过滤、奇异值分解

机器学习: 识别图片中的数字

应用PCA降维加速模型训练

如何从文本中提取特征信息?

使用sklearn做自然语言处理-1 

使用sklearn做自然语言处理-2

机器学习|八大步骤解决90%的NLP问题    

Python圈中的符号计算库-Sympy

Python中处理日期时间库的使用方法 

【视频讲解】Scrapy递归抓取简书用户信息

美团商家信息采集神器 

用chardect库解决网页乱码问题 





    您可能也对以下帖子感兴趣

    文章有问题?点此查看未经处理的缓存